const express = require('express')
const cors = require('cors')

const app = express()
// 配置 cors 跨域
app.use(cors())
// 配置解析表单数据的中间件
app.use(express.urlencoded({ extend: false }))

// 在处理函数中，需要多次调用 `res.send()` 向客户端响应 `处理失败` 的结果，
// 为了简化代码，可以手动封装一个 res.cc() 全局中间件函数
app.use((req, res, next) => {
  // status 默认为 1
  res.cc = (err, status = 1) => {
    res.send({
      status,
      // err 可能是 err.message 或者 字符串
      message: err instanceof Error ? err.message : err
    })
  }
  next()
})

// 导入配置文件
const config = require('./config')
const expressJMT = require('express-jwt')

// 使用 expressJWT 这个中间件，来解析 token
// 指定需要忽略的请求: 除了登录接口以外(/api/xxxx)，其他接口都需要进行身份认证
app.use(expressJMT({secret: config.jwtSecretKey}).unless({path: [/^\/api\//]}))

// 托管静态资源文件
app.use('/uploads', express.static('./uploads'))

// 导入用户路由模块
const useRouter = require('./router/user')
app.use('/api', useRouter)
// 导入用户信息路由模块
const userinfoRouter = require('./router/userinfo')
app.use('/my', userinfoRouter)
// 导入文章分类路由模块
const artcateRouter = require('./router/artcate')
app.use('/my/article', artcateRouter)
// 导入文章路由模块
const articleRouter = require('./router/article')
app.use('/my/article', articleRouter)



// 导入验证规则模块, joi.ValidationError 以判断是否验证错误
const joi = require('joi')
// 定义错误中间件
app.use((err, req, res, next) => {
  // 判断是否是验证错误
  if(err instanceof joi.ValidationError) {
    return res.cc(err)
  }
  // 捕获身份认证失败的错误
  if(err.name === 'UnauthorizedError') {
    return res.cc('身份认证失败！')
  }
  // 未知错误
  res.cc(err)
})


app.listen(3007, () => {
  console.log('Server is running on 127.0.0.1:3007')
})